//
//  JHNetworkManager.swift
//  Weibo_SwiftDemo
//
//  Created by gjh on 2021/1/1.
//

import UIKit
import AFNetworking

enum JHHTTPMethod {
    case GET
    case POST
}

// 网络管理工具
class JHNetworkManager: AFHTTPSessionManager {
    
    // 单例 静态区\常量\闭包
    // 在第一次访问时,执行闭包,并且将结果保存在shared 常量中
    // AFN 在请求的内容序列化的时候没有text/plain,
    static let instance: JHNetworkManager = {
        let instanced = JHNetworkManager()
        instanced.responseSerializer.acceptableContentTypes?.insert("text/plain")
        return instanced
    }()
    
    // 访问令牌, 所有网络请求都基于此令牌,(登录除外)
    /// 为了保护用户安全,token 是有时限的,默认用户是三天
    /// 模拟 token 过期,状态码是 403
//    var accessToken: String?// = "2.00KXfZwB33BqyB2f3d822d18rHIoMD"
    // 用户账户的懒加载属性
    lazy var userAccount = JHUserAccount()
    
    // 用户登录标记
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    /// 专门拼接 token 的网络请求方法,默认是 GET 请求
    func tokenRequest(method: JHHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping([String: Any]?, Bool) -> ()) {
        
        // 1\ 处理 token,判断是否为 nil,是则直接返回, 程序执行过程中,一般 token 不会为 nil
        guard let token = userAccount.access_token else {
            // 发送通知,提示用户登录
            print("没有 token, 需要登录")
            //
            NotificationCenter.default.post(name: NSNotification.Name(JHUserShouldLoginNotification), object: nil)
            completion(nil, false)
            return
        }
        // 判断 parameters 是否存在,为 nil 就建立字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: Any]()
        }
        // 设置参数字典,代码咋此处字典一定有值
        parameters!["access_token"] = token
        // 调用网络请求, 发起真正网络请求
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    
    
    /// 使用一个函数封装AFN的 get/post 请求
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组), 是否成功]
    /// - Returns: void
    func request(method: JHHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping([String: Any]?, Bool) -> ()) {
        // 成功回调
        let success = { (task: URLSessionDataTask, json: Any?) -> () in
            completion(json as? [String : Any], true)
        }
        // 失败回调
        let failure = { (task: URLSessionDataTask?, error: Error) -> () in
            
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token 过期了")
                // 发送通知,提示用户再次登录(本方法不知道是谁调用的,谁接收到通知,谁处理)
                NotificationCenter.default.post(name: NSNotification.Name(JHUserShouldLoginNotification), object: "bad token")
            }
            print("网络请求错误\(error)")
            completion(nil, false)
        }
        if method == .GET {
            get(URLString, parameters: parameters, headers: nil, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, headers: nil, progress: nil, success: success, failure: failure)
        }
        
    }
}
